import {
  _decorator,
  CCInteger,
  Collider,
  Collider2D,
  Component,
  Contact2DType,
  Node,
  Vec3,
} from "cc"
import { EnemyController } from "./EnemyController"
const { ccclass, property } = _decorator

@ccclass("BulletController")
export class BulletController extends Component {
  // 子弹发射速度
  @property({ type: CCInteger })
  public speed: number = 800

  start() {
    // 注册碰撞
    let collider = this.getComponent(Collider2D)
    if (collider) {
      // tips：该项目只需要使用到最简单的碰撞系统Builtin 2D,文档中说，此碰撞系统只会产生两个事件回调
      // tips: BEGIN_CONTACT 和 END_CONTACT 回调消息
      collider.on(Contact2DType.BEGIN_CONTACT, this.contactBeginHandler, this)
    }
  }

  update(deltaTime: number) {
    // 获取位置
    let bulletPosition = this.node.getPosition()
    // 更新y轴上的值，以此实现子弹向上飞
    bulletPosition.y += this.speed * deltaTime
    // 重新设置位置
    this.node.setPosition(new Vec3(bulletPosition.x, bulletPosition.y, 0))
    // 如果子弹超出屏幕，那么销毁该子弹，释放内存
    if (bulletPosition.y > 820) {
      this.node.destroy()
    }
  }

  // 和别人发生碰撞,碰撞的回调参数有三个，第一个是自己碰撞组件信息，第二个被碰那个信息，第三个是特殊参数只再box2d物理系统下有效
  // tips:敌机我们设置的tag是1
  contactBeginHandler(_, otherCollider: Collider2D) {
    if (otherCollider.tag === 1) {
      if(!otherCollider.getComponent(EnemyController).isDie){
        // 先销毁敌机
        otherCollider.getComponent(EnemyController).die()
        // 再销毁自身
        this.node.destroy()
      }
    }
  }
}
